E) istream_iterator& ostream_iterator

스트림 반복자(stream iterator)
반복자 연산을 통해 알고리즘이 입출력 스트림에 보다 쉽게 접근할 수 있도록 해준다.

입력 스트림 반복자 istream_iterator
출력 스트림 반복자 ostream_iterator
// istream_iterator
template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
class istream_iterator : public iterator<input_iterator_tag, T, Distance, const T*, const T&> { ... }
// ostream_iterator
template <class T, class charT = char, class traits = char_traits<charT> >
class ostream_iterator : public iterator<output_iterator_tag, void, void, void, void> { ... }
사용 예제
vector<int> vc={1, 2, 3, 4, 5};
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout));
cout<<endl;
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout, " "));
copy 연산은 내부적으로 할당 연산자(operator=)을 사용한다.

std::copy는 begin부터 end까지 ( , ] 구간을 std::ostream_iterator 함수 객체에 대하여 =assign 연산을 수행한다.
ostream_iterator 내부에 아래와 같이 operator=을 정의한다
(cout이 첫 번째 인자이고, ‘ ‘가 두번째 인자인 경우
cout<<_val;
cout<<‘ ‘; 연산을 수행
template<class _Ty, class _Elem=char, class _Traits=char_traits<_Elem>>
class ostream_iterator :public _Outit{
public:
typedef _Elem char_type;
typedef _Traits traits_type;
typedef basic_ostream<_Elem, _Triats> ostream_type;
#if _SECURE_SCL
typedef _Range_checked_iterator_tag _Checked_iterator_category;
#endif
ostream_iterator(ostream_type& _Ostr, const _Elem* _Delim=0): _Myostr(&_Ostr), _mydelim(_Delim){ }
ostream_iterator<_Ty, _Elem, _Traits>& operaotr=(const _Ty& _Val){
*_Myostr<<_Val;
if(_Mydelim!=0) *_Myostr<<_Mydelim;
}
// ...
}